package cnsatmsmart.automation.mmi.model.layers;

/**
 * @author SIK - PTIK, BPPT
 **/

import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.proj.Projection;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.io.Serializable;

import cnsatmsmart.automation.mmi.helper.utilities.GlobalEnvVars;

public class OMLabelTriangle extends OMGraphic implements Serializable {
    /* const */
        private static final Color FIXES_COLOR = new Color (225, 225, 225, 100);
            //nilai warna default untuk pewarnaan pada penggambaran segitiga yang merupakan instance dari kelas OMLabelTriangle
        private static final int FIXES_SIZE = 16;
            //nilai sisi-sisi default pada penggambaran segitiga yang merupakan instance dari kelas OMLabelTriangle
        private static final int NPOINTS = 3;
            //banyaknya jumlah titik sudut sebuah segitiga yang merupakan instance dari kelas OMLabelTriangle
    
    /* atribut - atribut yang dimiliki oleh kelas OMLabelTriangle */
        private float latitude;                     //posisi titik pusat object pada garis lintang
        private float longitude;                    //posisi titik pusat object pada garis bujur
        private int[] xPoints = new int[NPOINTS];   //posisi titik-titik sudut object pada bidang kartesian searah sumbu axis
        private int[] yPoints = new int[NPOINTS];   //posisi titik-titik sudut object pada bidang kartesian searah sumbu ordinat
        private int side = FIXES_SIZE;              //ukuran panjang sisi object (jarak garis lurus dua buah titik sudut)
        private String label;                       //label dari object
        private Color color = FIXES_COLOR;          //warna dari object

    /* constructor - user defined ctor, no default ctor */
        // <editor-fold defaultstate="collapsed" desc="ctor">
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi FIXES_SIZE - const private static final int = 16<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         */
        public OMLabelTriangle(float lat, float lon) {
            this(lat, lon, FIXES_SIZE, null, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         * @param side int yang merupakan panjang sisi segitiga samasisi dalam pixel
         */
        public OMLabelTriangle(float lat, float lon, int side) {
            this(lat, lon, side, null, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - tidak memiliki label<br />
         * - memiliki warna color
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         * @param side int yang merupakan panjang sisi segitiga samasisi dalam pixel
         * @param color java.awt.Color yang merupakan warna dari segitiga samasisi
         */
        public OMLabelTriangle(float lat, float lon, int side, Color color) {
            this(lat, lon, side, null, color);
        }
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi FIXES_SIZE - const private static final int = 16<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelTriangle(float lat, float lon, String label) {
            this(lat, lon, FIXES_SIZE, label, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         * @param side int yang merupakan panjang sisi segitiga samasisi dalam pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelTriangle(float lat, float lon, int side, String label) {
            this(lat, lon, side, label, FIXES_COLOR);
        }
        /**
         * menginstansiasi object OMLabelTriangle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki panjang sisi side<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna color
         * @param lat float yang merupakan posisi titik pusat segitiga samasisi pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat segitiga samasisi pada koordinat bujur
         * @param side int yang merupakan panjang sisi segitiga samasisi dalam pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         * @param color java.awt.Color yang merupakan warna dari segitiga samasisi
         */
        public OMLabelTriangle(float lat, float lon, int side, String label, Color color) {
            this.latitude = lat;
            this.longitude = lon;
            this.side = side;
            this.label = label;
            this.color = color;
        }
        // </editor-fold>

    /**
     * Prepare the graphic for rendering. This must be done before calling render()! If a vector graphic has lat-lon components, then we project these vertices into x-y space. For raster graphics we prepare in a different fashion.<br />
     * If the generate is unsuccessful, it's usually because of some oversight, (for instance if proj is null), and if debugging is enabled, a message may be output to the controlling terminal.<br />
     * membangkitkan graphics dan mempersiapkannya untuk rendering bergantung kepada projection saat ini
     * @param prjctn Projection yang merupakan projection saat ini
     * @return boolean : true jika dan hanya jika pembangkitan berhasil dilakukan dan false jika sebaliknya
     */
    @Override
    public boolean generate (Projection prjctn) {
        Point point = prjctn.forward(this.latitude, this.longitude);

        int h = (int) (this.side * (GlobalEnvVars.SIN30 / GlobalEnvVars.COS30) / 2.0f);

        this.xPoints[0] = point.x - h;
        this.yPoints[0] = point.y + h;

        this.xPoints[1] = point.x + h;
        this.yPoints[1] = point.y + h;

        this.xPoints[2] = point.x;
        this.yPoints[2] = point.y - h;
    
        return (true);
    }

    /**
     * Paint the graphic. This paints the graphic into the Graphics context. This is similar to paint() function of java.awt.Components. Note that if the graphic has not been generated, it will not be rendered.<br />
     * This method used to be abstract, but with the conversion of OMGraphics to internally represent themselves as java.awt.Shape objects, it's a more generic method. If the OMGraphic hasn't been updated to use Shape objects, it should have its own render method.<br />
     * melakukan rendering segitiga samasisi jika dan hanya jika graphics sudah dibangkitkan
     * @param graphics Graphics yang merupakan konteks segitiga samasisi yang akan dirender
     */
    @Override
    public void render (Graphics graphics) {
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.setColor(this.color);

        g2d.drawPolygon(xPoints, yPoints, NPOINTS);

        if (this.label != null) {
            FontMetrics fm = g2d.getFontMetrics();
            int w = fm.stringWidth(this.label);
            
            g2d.drawString(this.label, this.xPoints[2] - w, this.yPoints[2]);
        }
    }
}
